package pruebas;

import junit.framework.TestCase;
import modelo.*;
import modelo.armas.*;
import modelo.moviles.exceptions.ArsenalSinArmas;
import modelo.moviles.balas.Bala;
import modelo.moviles.naves.Algo42;
import modelo.moviles.naves.Avioneta;
import modelo.moviles.naves.Bombardero;
import modelo.moviles.naves.Caza;

public class TestNaveArmada extends TestCase{

	/* "testea la nave Algo42" */
	public void testAlgo42(){

		Nivel nivel = new Nivel(10,13);
		Algo42 nave = new Algo42(nivel);

		/* "El Algo42 debe ser creado en el medio de la pantalla, en la fila 10" */ 
		assertEquals("El dividir no anda",nave.getColumna(),  6);
		assertEquals("No guarda la fila",nave.getFila(), 10);

		/* "cuando inicia la nave debe poder disparar" */
		assertTrue("La nave no fue bien creada",nave.puedeDisparar());

		/* "al disparar debe soltar balas lasers cuya intensidad es de 30" */
		Bala bala =  null;
		try {
			bala = nave.disparar();
		} catch( ArsenalSinArmas e){
			System.err.println(e.getDetalle());
		}
		
		assertEquals("La nave no esta disparando",bala.getIntensidad(),30);

		/* "el laser siempre tiene balas, disparamos 25 y vemos que sigue teniendo" */
		try {
			for (int i = 1; i<26; i++){
				bala = nave.disparar();
			}
		} catch( ArsenalSinArmas e){
			System.err.println(e.getDetalle());
		}

		assertTrue("La nave se quedo sin balas",nave.puedeDisparar());

		/* "creamos un arsenal con un Cohete y se lo agregamos a la nave" */
		Arsenal arsenal = new Arsenal();
		arsenal.agregarArma(new Cohete(nivel));

		nave.agregarArsenal(arsenal);

		assertTrue("La nave no puede agregar arsenal",nave.puedeDisparar());

		/* "al disparar debe soltar  2 balas Cohete cuya intensidad es de 100" */
		try {
			for (int i = 1; i<3; i++){
				nave.puedeDisparar();
				bala = nave.disparar();
				assertEquals("La nave no esta agregando arsenales",bala.getIntensidad(),100);
			}
		} catch( ArsenalSinArmas e){
			System.err.println(e.getDetalle());
		}
					
				
		/* "al disparar una tercer vez debe soltar una bala Laser" */
		nave.puedeDisparar();
		try {
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){
			
		}
		assertEquals("La nave no esta descartando armas",bala.getIntensidad(), 30);
	}

	
	/* "testea la nave Avioneta" */
	public void testAvioneta(){
		
		Nivel nivel = new Nivel(10,12);
		Avioneta nave = new Avioneta(nivel);
		nave.setPosicion(new Posicion(1,5));

		/* "cuando inicia la nave debe poder disparar" */
		assertTrue("La nave no fue bien creada",nave.puedeDisparar());

		/* "al disparar debe soltar balas lasers cuya intensidad es de 30" */
		Bala bala =  null;
		try {
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){		
		}
		
		assertEquals("La nave no esta disparando",bala.getIntensidad(), 30);

		/* "el laser siempre tiene balas, disparamos 25 y vemos que sigue teniendo" */
		try {
			for (int i = 1; i<26; i++){
				bala = nave.disparar();
			}
		} catch( ArsenalSinArmas e){
			System.err.println(e.getDetalle());
		}
		assertTrue("La nave se quedo sin balas",nave.puedeDisparar());
	}

	
	/* "testea la nave Bombardero" */
	public void testBombardero(){

		Nivel nivel = new Nivel(10,12);
		Bombardero nave = new Bombardero(nivel);
		nave.setPosicion(new Posicion(1,5));

		Algo42 algo42 = new Algo42(nivel);
		algo42.setPosicion(new Posicion(10,5));
		nave.setObjetivo(algo42);	

		/* "cuando inicia la nave debe poder disparar" */
		assertTrue("La nave no fue bien creada",nave.puedeDisparar());

		/* "al disparar debe soltar balas lasers cuya intensidad es de 30" */
		Bala bala =  null;

		/* "al disparar debe soltar  2 balas Cohete cuya intensidad es de 100" */
		try {
			for (int i = 1; i<3; i++){
				nave.puedeDisparar();
				bala = nave.disparar();
				assertEquals("La nave no disparo cohetes en primer lugar",bala.getIntensidad(),100);
			}
		} catch( ArsenalSinArmas e){
			System.err.println(e.getDetalle());
		}
						
		try {
			for (int i = 1; i<6; i++){
				nave.puedeDisparar();
				bala = nave.disparar();
				assertEquals("La nave no disparo torpedos rastreadores en segundo lugar",bala.getIntensidad(),35);
			}
		} catch( ArsenalSinArmas e){
			System.err.println(e.getDetalle());
		}

		/* "al disparar una vez mas debe soltar una bala Laser" */
		nave.puedeDisparar();
		try {
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){		
		}
		assertEquals("La nave no esta descartando armas",bala.getIntensidad(),30);
		

		/* "el laser siempre tiene balas, disparamos 25 y vemos que sigue teniendo" */
		try {
			for (int i = 1; i<26; i++){
				bala = nave.disparar();
			}
		} catch( ArsenalSinArmas e){
			System.err.println(e.getDetalle());
		}
		assertTrue("La nave se quedo sin balas",nave.puedeDisparar());
	
	}
	

	
	/* "testea la nave Caza" */
	public void testCaza(){
		
		Nivel nivel = new Nivel(10,12);
		Caza nave = new Caza(nivel);
		nave.setPosicion(new Posicion(1,5));


		/* "cuando inicia la nave debe poder disparar" */
		assertTrue("La nave no fue bien creada",nave.puedeDisparar());

		/* "los primeros diez disparos deben ser balas torpedo simple cuya intensidad es de 40" */
		Bala bala = null;
		try {
			for (int i = 1; i<11; i++){
				nave.puedeDisparar();
				bala = nave.disparar();
				assertEquals("La nave no disparo torpedos rastreadores en segundo lugar",bala.getIntensidad(),40);
			}
		} catch( ArsenalSinArmas e){
			System.err.println(e.getDetalle());
		}

		/* "Luego de esos 10 disparos la nave no debe poder disparar" */
		assertFalse("La nave puede disparar sin tener balas",nave.puedeDisparar());

	}

}
